package lei.j_java泛型_匿名内部类_反射.匿名内部类;

/**
 * @className: Main
 * @author: xl
 * @date: 2025/7/18 22:27
 * @Version: 1.0
 * @description:
 */

public class Main {
    public static void main(String[] args) {

        /**
         * 4. 匿名内部类的特点
         * 隐式实现接口或继承类：匿名内部类会隐式地实现一个接口或者继承一个类。
         * 无显式类名：由于没有明确的类名，所以不能在其他地方复用该类。
         * 局部作用域：匿名内部类只能在定义它的地方使用。
         * 访问外部变量：可以访问外部类的成员变量和方法，若要访问局部变量，该局部变量必须是final或者effectively final的。
         * 构造器限制：匿名内部类不能有显式的构造器，但可以使用实例初始化块。
         *
         *5. 匿名内部类与 Lambda 表达式的对比
         * Java 8 引入的 Lambda 表达式对匿名内部类进行了简化，不过 Lambda 表达式只能用于函数式接口（即只有一个抽象方法的接口）。
         *
         *
         * 6. 匿名内部类的使用限制
         * 无法定义静态成员：匿名内部类中不能包含静态字段、方法或者类。
         * 无法继承其他类：匿名内部类在继承一个类的同时，不能再继承其他类。
         * 语法复杂度：当实现的逻辑较为复杂时，匿名内部类的代码可读性会变差。
         *
         *
         * 匿名内部类适合在需要简单实现接口或继承类，并且该实现只需使用一次的场景中使用。它能让代码更加简洁，
         * 但也存在一定的局限性。在 Java 8 及以后的版本中，对于函数式接口，推荐使用 Lambda 表达式来替代匿名内部类。
         */
        // 使用匿名内部类实现Greeting接口
        //3.1 实现接口
        Greeting greeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Hello, anonymous class!");
            }
        };
        greeting.sayHello(); // 输出: Hello, anonymous class!



        // 使用匿名内部类继承Animal抽象类
        //3.2 继承抽象类
        Animal cat = new Animal() {
            @Override
            void sound() {
                System.out.println("Meow!");
            }
        };
        cat.sound(); // 输出: Meow!

        //3.3 作为方法参数
        // 匿名内部类作为参数传递
        performOperation(10, 5, new Calculator() {
            @Override
            public int calculate(int a, int b) {
                return a + b;
            }

            @Override
            public int divculate(int a, int b) {
                return a/b;
            }
        }); // 输出: Sum: 15


        // 使用匿名内部类实现普通接口
        MultiMethodInterface obj = new MultiMethodInterface() {
            @Override
            public void method1() {
                System.out.println("Method 1 implemented");
            }

            @Override
            public void method2() {
                System.out.println("Method 2 implemented");
            }
        };
        obj.method1();
        obj.method2();



    }


    public static void performOperation(int a, int b, Calculator calculator) {
        System.out.println("Sum: " + calculator.calculate(a, b));
        System.out.println("Division: " + calculator.divculate(a, b));
    }
}



abstract class Animal {
    abstract void sound();
}
